home *** CD-ROM | disk | FTP | other *** search
- {$g+,x-,o-,q-,r-,s-,d-,l-,y-,a+,n-,e-,p-,t-,v-,y-}
- uses gru;
- const
- add1=1;
- add2=-1;
- add3=-1;
- sofs=75;
- samp=75;
- slen=255;
- sprpic:array[0..15,0..15]of byte=(
- (0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0),
- (0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
- (0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
- (0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
- (0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
- (0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
- (1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
- (1,1,1,1,2,2,3,4,4,3,2,2,1,1,1,1),
- (1,1,1,1,2,2,3,3,3,3,2,2,1,1,1,1),
- (0,1,1,1,1,2,2,3,3,2,2,1,1,1,1,0),
- (0,1,1,1,1,1,2,2,2,2,1,1,1,1,1,0),
- (0,0,1,1,1,1,1,2,2,1,1,1,1,1,0,0),
- (0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0),
- (0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0),
- (0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0),
- (0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0));
- type
- sinarray=array[0..slen]of word;
-
- var
- stab:sinarray; { Used to move shade bob. }
- ctab:array[0..319] of byte;
- stab1,stab2,stab3:array[0..255] of byte;
- i,i1,i2,i3:word;
- workp:pointer;
- work:word;
- timer:longint absolute $0040:$006c;
- frame,t1,t2:longint;
- pal1,pal2:paltype;
-
- function keypressed:boolean; assembler;
- asm
- mov ah, 01h
- int 16h
- mov ax, 00h
- jz @1
- inc ax
- @1:
- end;
-
- function readkey:char; assembler;
- asm
- xor ah,ah
- int 16h
- end;
-
- procedure virtup;
- begin
- getmem(workp,64000);
- work:=seg(workp^);
- clear386(work,0);
- end;
-
- procedure virtdn;
- begin
- work:=0;
- freemem(workp,64000);
- end;
-
- procedure calcsinus;
- begin
- for i:=0 to slen do stab[i]:=round(sin(i*4*pi/slen)*samp)+sofs;
- for i:=0 to 255 do begin
- stab1[i]:=round(sin(i*2*pi/255)*50)+109;
- stab2[i]:=round(cos(i*4*pi/255)*25);
- stab3[i]:=round(sin(i*4*pi/255)*25);
- end;
- fillchar(ctab,sizeof(ctab),0);
- i1:=0; i2:=25; i3:=100;
- end;
-
- procedure init;
- begin
- virtup;
- calcsinus;
- frame:=0;
- end;
-
- procedure volplot(x,y,where:word;c:byte);
- begin
- plot2(x,y,where,c);
- plot2(x+1,y,where,c+1);
- plot2(x,y+1,where,c+2);
- plot2(x+1,y+1,where,c+3);
- end;
-
- procedure volsmoth(x,y,where:word);
- begin
- smooth1(x,y,where);
- smooth1(x+1,y,where);
- smooth1(x,y+1,where);
- smooth1(x+1,y+1,where);
- end;
-
- function abort:boolean;
- begin
- abort:=(keypressed)and(readkey=#27);
- end;
-
- procedure waves;
- var
- x,y,s,e,loops:word;
- done,dir:boolean;
- begin
- s:=159;
- e:=161;
- done:=false;
- repeat
- clear386(work,0);
- for i:=s to e do
- begin
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- volplot(i,ctab[i],work,ctab[i]);
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i-1,ctab[i],work);
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i+1,ctab[i]+1,work);
- smooth1(i+1,ctab[i],work);
- smooth1(i,ctab[i]+1,work);
- smooth1(i-1,ctab[i]+1,work);
- smooth1(i+1,ctab[i]-1,work);
- smooth1(i,ctab[i],work);
- end;
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- flip386(work,vidseg);
- if(frame mod 3)=0 then
- begin
- if(s>1)then dec(s);
- if(e<318)then inc(e);
- end;
- inc(frame);
- if(s<=1)and(e>=318)then done:=true;
- until(done)or(abort);
- done:=false;
- s:=0;
- repeat
- clear386(work,0);
- done:=true;
- for i:=0 to 319 do
- begin
- if(ctab[i]>0)then done:=false;
- plot2(i,ctab[i],work,ctab[i]);
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i-1,ctab[i],work);
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i+1,ctab[i]+1,work);
- smooth1(i+1,ctab[i],work);
- smooth1(i,ctab[i]+1,work);
- smooth1(i-1,ctab[i]+1,work);
- smooth1(i+1,ctab[i]-1,work);
- smooth1(i,ctab[i],work);
- if(ctab[i]>0)then dec(ctab[i]);
- end;
- inc(frame);
- flip386(work,vidseg);
- until(done)or(abort);
- done:=false;
- s:=159; e:=161;
- repeat
- clear386(work,0);
- for i:=s to e do
- begin
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- vline2(i,0,ctab[i],work,ctab[i]);
- vline2(i,ctab[i],199,work,not(ctab[i]+40));
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i-1,ctab[i],work);
- smooth1(i-1,ctab[i]-1,work);
- smooth1(i+1,ctab[i]+1,work);
- smooth1(i+1,ctab[i],work);
- smooth1(i,ctab[i]+1,work);
- smooth1(i-1,ctab[i]+1,work);
- smooth1(i+1,ctab[i]-1,work);
- smooth1(i,ctab[i],work);
- end;
- flip386(work,vidseg);
- if(frame mod 3)=0 then
- begin
- if(s>1)then dec(s);
- if(e<318)then inc(e);
- end;
- inc(frame);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- if(s<=1)and(e>=318)then done:=true;
- until(done)or(abort);
- done:=false;
- s:=99; e:=101;
- repeat
- clear386(work,0);
- for i:=s to e do
- begin
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- hline2(0,ctab[i]+99,i,work,ctab[i]);
- hline2(ctab[i]+99,319,i,work,not(ctab[i]+40));
- end;
- for i:=0 to 319 do
- begin
- smooth1(i,s,work);
- smooth1(i,e,work);
- smooth1(i,s+1,work);
- smooth1(i,e-1,work);
- end;
- flip386(work,vidseg);
- if(frame mod 3)=0 then
- begin
- if(s>1)then dec(s);
- if(e<198)then inc(e);
- end;
- inc(frame);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- if(s<=1)and(e>=198)then done:=true;
- until(done)or(abort);
- done:=false;
- loops:=0;
- i:=0;
- repeat
- smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(i);
- done:=(i>=299);
- until(done)or(abort);
- done:=false;
- dir:=true;
- i:=0;
- clear386(work,0);
- repeat
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- volplot(i,ctab[i]-5,work,ctab[i]);
- if(dir)then inc(i)else dec(i);
- if(i>=318)or(i<=0)then dir:=not(dir);
- smooth(work);
- flip386(work,vidseg);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- done:=(loops>=990);
- inc(frame);
- inc(loops);
- until(done)or(abort);
- done:=false;
- dir:=true;
- i:=0;
- loops:=0;
- repeat
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- line2(0,0,i,ctab[i],work,ctab[i]);
- smooth(work);
- if(dir)then inc(i)else dec(i);
- if(i>=318)or(i<=0)then dir:=not(dir);
- flip386(work,vidseg);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- done:=(loops>=960);
- inc(frame);
- inc(loops);
- until(done)or(abort);
- done:=false;
- i:=0;
- repeat
- smooth(work);
- flip386(work,vidseg);
- inc(frame);
- done:=(i>=230);
- inc(i);
- until(done)or(abort);
- end;
-
- procedure bobs;
- var
- loop,cnt:longint;
- x,y,x2,y2,x3,y3:integer;
- i,j,i2,j2,i3,j3:byte;
- dir,done:boolean;
- begin
- getvgapal(pal1);
- for i:=1 to 255 do
- begin
- with pal2[i]do
- begin
- r:=(i shl 2)+25;
- g:=(i shl 1)-1;
- b:=i;
- end;
- end;
- f2black(pal1);
- clear386(work,0);
- i:=0;
- j:=25;
- for cnt:=0 to 199 do
- begin
- x:=2*stab[i];
- y:=stab[j];
- inc(i);
- inc(j);
- drawsprite(x,y,work,16,16,0,sprpic);
- end;
- flip386(work,vidseg);
- ffblack(pal2);
- i:=0;
- j:=25;
- dir:=false;
- done:=false;
- loop:=0;
- repeat
- x:=2*stab[i];
- y:=stab[j];
- inc(i);
- inc(j);
- drawsprite(x,y,work,16,16,0,sprpic);
- dir:=not(dir);
- if(dir)then smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=500);
- until(abort)or(done);
- { End of the first comet bob. }
- i:=0; j:=25;
- i2:=50; j2:=70;
- dir:=false;
- done:=false;
- loop:=0;
- clear386(work,0);
- repeat
- x:=2*stab[i]; y:=stab[j];
- x2:=2*stab[i2]; y2:=stab[j2];
- inc(i); inc(j);
- inc(i2); inc(j2);
- drawsprite(x,y,work,16,16,0,sprpic);
- drawsprite(x2,y2,work,16,16,0,sprpic);
- dir:=not(dir);
- if(dir)then smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=500);
- until(abort)or(done);
- { end of the second comet bob }
- i:=0; j:=25;
- i2:=50; j2:=60;
- i3:=50; j3:=0;
- dir:=false;
- done:=false;
- loop:=0;
- clear386(work,0);
- repeat
- x:=2*stab[i]; y:=stab[j];
- x2:=2*stab[i2]; y2:=stab[j2];
- x3:=2*stab[i3]; y3:=stab[j3];
- inc(i); inc(j);
- inc(i2); dec(j2);
- dec(i3); inc(j3);
- drawsprite(x,y,work,16,16,0,sprpic);
- drawsprite(x2,y2,work,16,16,0,sprpic);
- drawsprite(x3,y3,work,16,16,0,sprpic);
- dir:=not(dir);
- if(dir)then smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=500);
- until(abort)or(done);
- { end of the third comet bob. This one have THREE bobs! }
- i:=0; j:=25;
- dir:=false;
- done:=false;
- loop:=0;
- clear386(work,0);
- repeat
- x:=2*stab[i]; y:=stab[j];
- inc(i); inc(j);
- line2(0,0,x+8,y+8,work,2);
- line2(319,0,x+8,y+8,work,4);
- line2(0,199,x+8,y+8,work,2);
- line2(319,199,x+8,y+8,work,4);
- drawsprite(x,y,work,16,16,0,sprpic);
- dir:=not(dir);
- if(dir)then smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=800);
- until(abort)or(done);
- { End of the tracking fire bob. }
- getvgapal(pal1);
- f2black(pal1);
- { Fade to black }
- end;
-
- procedure bobwaves;
- {
- This is gonna be a SHORT "chapter"!
- And it's not going to cover ONLY sinus-bobs.
- }
- const
- maxtrail:word=3;
- var
- c,x,y,x2,y2,x3,y3:integer;
- loop,cnt:longint;
- dir,done:boolean;
- i,j:byte;
-
- begin
- for i:=1 to 255 do
- begin
- with pal1[i]do
- begin
- r:=i*3;
- g:=i*3;
- b:=i*3;
- end;
- end;
- clear386(work,0);
- clear386(vidseg,0);
- setvgapal(pal1);
- done:=false;
- loop:=0;
- repeat
- clear386(work,0);
- for i:=0 to (184 shr 1)do
- begin
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- x:=ctab[i]+90;
- y:=(i);
- drawsprite(x,y shl 1,work,16,16,0,sprpic);
- end;
- for i:=0 to (303 shr 1) do
- begin
- ctab[i]:=stab1[(i+i1) mod 255]+stab2[(i+i2) mod 255]+stab3[(i+i3) mod 255];
- x:=i;
- y:=ctab[i];
- drawsprite(x shl 1,y,work,16,16,0,sprpic);
- end;
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=1000);
- until(done)or(abort);
- { End of the first double-sinus-bob. }
- clear386(work,0);
- clear386(vidseg,0);
- done:=false;
- loop:=0;
- repeat
- clear386(work,0);
- for c:=0 to 319 do
- ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
- line2(0,ctab[0],319,ctab[319],work,10);
- line2(ctab[0]+30,0,ctab[199],199,work,10);
- drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
- drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
- drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
- drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=2000);
- until(done)or(abort);
- { End of the first sinus-line bob show. }
- clear386(work,0);
- clear386(vidseg,0);
- done:=false;
- loop:=0;
- repeat
- for c:=0 to 319 do
- ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
- line2(0,ctab[0],319,ctab[319],work,10);
- line2(ctab[0]+30,0,ctab[199],199,work,10);
- drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
- drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
- drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
- drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- smooth(work);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=1000);
- until(done)or(abort);
- { End of the smoothed sinus-line bob show. }
- getvgapal(pal1);
- for i:=1 to 255 do
- begin
- with pal2[i]do
- begin
- r:=(i shl 2)+25;
- g:=(i shl 1)-1;
- b:=i;
- end;
- end;
- fadefrompaltopal(pal1,pal2);
- done:=false;
- loop:=0;
- repeat
- for c:=0 to 319 do
- ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
- line2(0,ctab[0],319,ctab[319],work,5);
- line2(ctab[0]+30,0,ctab[199],199,work,5);
- drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
- drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
- drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
- drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- smooth(work);
- line2(0,199,319,199,work,0);
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=1000);
- until(done)or(abort);
- { End of the smoothed sinus-line bob with fire colors show. }
- done:=false;
- loop:=0;
- cnt:=0;
- getvgapal(pal1);
- for i:=1 to 255 do
- begin
- with pal2[i]do
- begin
- r:=i;
- g:=sqr(i);
- b:=(i shl 2)+25;
- end;
- end;
- fadefrompaltopal(pal1,pal2);
- clear386(work,0);
- clear386(vidseg,0);
- repeat
- for c:=0 to 319 do
- ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
- line2(0,ctab[0],319,ctab[319],work,(i mod 3)+5);
- line2(ctab[0]+30,0,ctab[199],199,work,(i mod 3)+4);
- line2(0,199,319,199,work,0);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- inc(cnt);
- if(cnt>=maxtrail)then
- begin
- smooth(work);
- cnt:=0;
- end;
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=1500);
- until(done)or(abort);
- { End of the traily line. }
- i:=0;
- j:=25;
- c:=0;
- loop:=0;
- done:=false;
- clear386(work,0);
- repeat
- if(c>4)then
- begin
- c:=0;
- smooth(work);
- line2(160,100,x,y,work,8);
- end;
- x:=2*stab[i];
- y:=stab[j];
- inc(i);
- inc(j);
- drawsprite(x,y,work,16,16,0,sprpic);
- line2(0,0,319,0,work,0);
- line2(0,0,0,199,work,0);
- line2(0,199,319,199,work,0);
- line2(319,199,319,0,work,0);
- flip386(work,vidseg);
- done:=(loop>1500);
- inc(c);
- inc(loop);
- until(done)or(abort);
- { Okay, maybe not exactly a bob-line, but it still rock! ;-) }
- clear386(work,0);
- clear386(vidseg,0);
- done:=false;
- dir:=false;
- loop:=0;
- repeat
- clear386(work,0);
- for c:=0 to 319 do
- ctab[c]:=stab1[(c+i1) mod 255]+stab2[(c+i2) mod 255]+stab3[(c+i3) mod 255];
- line2(0,ctab[0],319,ctab[319],work,3);
- line2(ctab[0]+30,0,ctab[199],199,work,3);
- line2(0,ctab[319],319,ctab[0],work,30);
- line2(ctab[199],0,ctab[0],199,work,30);
- line2(0,ctab[160],319,ctab[99],work,50);
- line2(ctab[99],0,ctab[160],199,work,50);
- drawsprite(ctab[160],ctab[99],work,16,16,0,sprpic);
- drawsprite(ctab[99],ctab[160],work,16,16,0,sprpic);
- drawsprite(ctab[1],ctab[200],work,16,16,0,sprpic);
- drawsprite(ctab[200],ctab[1],work,16,16,0,sprpic);
- drawsprite(ctab[100],ctab[10],work,16,16,0,sprpic);
- drawsprite(ctab[10],ctab[199],work,16,16,0,sprpic);
- drawsprite(ctab[300],ctab[50],work,16,16,0,sprpic);
- drawsprite(ctab[50],ctab[100],work,16,16,0,sprpic);
- i1:=(i1+add1) mod 255; i2:=(i2+add2) mod 255; i3:=(i3+add3) mod 255;
- flip386(work,vidseg);
- inc(frame);
- inc(loop);
- done:=(loop>=2300);
- until(done)or(abort);
- { End of retarded crosses with EIGHT bobs show. }
- end;
-
- procedure main;
- begin
- init;
- setmode($13);
- for i:=1 to 199 do setpal(i,i div 4,20+i div 5,10+i div 6);
- t1:=timer;
- waves;
- bobs;
- bobwaves;
- t2:=(timer-t1);
- setmode($03);
- writeln('SiNUS "DEMO". Whatever. Coded by Sune Marcher');
- writeln('You saw ',frame,' of the demos frames.');
- writeln('It took ',(t2/18.2):0:1,' seconds.');
- writeln(' (',((t2/18.2)/60):0:1,' minutes).');
- writeln(round((frame*18.2)/t2),' fps.');
- virtdn;
- end;
-
- begin
- main;
- end.